# @Author   :hcs
# @File     :6-匹配分组.py
# @Time     :2025/2/28 上午12:00
import re

# 需求：匹配出0-100之间的数字
ret = re.match(r"[1-9]?\d$|100$", "100")
print(ret.group())

print('-' * 50)

# 需求：匹配出163、126、qq邮箱
email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", "xiaowang@qq.com"]
for email in email_list:
    ret = re.match(r"\w{5,20}@(163|126|qq)\.com$", email)
    if ret:
        print(f"{email}是合法的！")
    else:
        print(f"{email}是不合法的！")

print('-' * 50)

#  ([^-]*) 代表没有遇到小横杠-就一直进行匹配，一直匹配下去
# () :表示将括号中字符作为一个分组
ret = re.match(r"([^-]+)-(\d+)", "010-12345678")  # 用括号括起来的就算是一个捕获组
"""
    group() 方法的详细用法
1. ret.group()
功能：group() 方法不带参数时，返回整个匹配的字符串。
示例代码中的作用：在代码中 ret.group() 会返回与正则表达式 r"([^-]+)-(\\d+)" 完全匹配的部分，也就是 "010-12345678"。
2. ret.group(1)
功能：group() 方法传入一个整数参数时，返回指定捕获组的内容。捕获组从 1 开始编号，按左括号出现的顺序依次递增。
示例代码中的作用：在代码中 ret.group(1) 会返回第一个捕获组 ([^-]+) 匹配的内容，也就是 "010"。
3. ret.group(2)
功能：同理，group(2) 会返回第二个捕获组 (\\d+) 匹配的内容。
示例代码中的作用：在代码中 ret.group(2) 会返回 "12345678"。
"""
if ret:
    print(ret.group())  # 等同于print(ret.group(0))
    print(ret.group(1))
    print(ret.group(2))

print('-' * 50)

# \num :表示引用分组num匹配到的字符串
# 通过引用分组中匹配到的数据即可，但是要注意是元字符串，即类似 r""这种格式
# 需求：匹配出<html>hh</html>
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
print(ret.group())

print('-' * 50)

# \number(多个)
labels = ["<html><h1>www.cskaoyan.com</h1></html>", "<html><h1>www.cskaoyan.com</h2></html>"]
for label in labels:
    ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)

print('-' * 50)

# (?P<name>) :表示给分组起别名
# 需求：匹配出<html><h1>www.cskaoyan.com</h1></html>
for label in labels:
    ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", label)
    if ret:
        print(f"{label}是符合要求的标签！")
    else:
        print(f"{label}不是符合要求的标签！")

print('-' * 50)

